package com.feimt.advice;

import com.feimt.common.CustomException;
import com.feimt.result.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.SQLIntegrityConstraintViolationException;

/**
 * @author 宋孟林
 * @description 全局异常处理器，当controller层的控制方法出现注解中指定的异常类型就会触发这个异常，
 * 并且处理，这样就不用在每个方法中都进行异常处理的逻辑了，少了很多异常处理的编写
 */
@RestControllerAdvice
@Slf4j
public class GlobalAdvice {

    /**
     * SQLIntegrityConstraintViolationException 是 Java 数据库连接 (JDBC) 中的一种异常，
     * 属于 SQLException 的子类。这个异常表示在数据库操作过程中违反了某种完整性约束
     * @param e 异常对象
     * @return 返回前端信息展示
     */
    @ExceptionHandler(SQLIntegrityConstraintViolationException.class)
    public R<String> sqlEX(SQLIntegrityConstraintViolationException e){
        log.info("异常信息：{}", e.getLocalizedMessage());
        String message = e.getMessage();
        String msg = "系统繁忙，请稍后再试";
        if (message.contains("Duplicate entry")){
            String[] s = e.getMessage().split(" ");//split()方法返回一个子字符串数组
            String[] str = s[2].split("'");
            if (message.contains("user")){
                msg = "用户名: "+ str[1] + " 已经存在,请修改后提交！";
            }else if (message.contains("dish")){
                msg = "菜品名: "+ str[1] + " 已经存在,请修改后提交！";
            }else if (message.contains("setmeal")){
                msg = "套餐名: " + str[1] + " 已经存在,请修改后提交";
            }
        }
        return R.error(msg);
    }

    /**
     *自定义异常
     * @param e 异常对象
     * @return 返回前端信息展示
     */
    @ExceptionHandler(CustomException.class)
    public R<String> customException(CustomException e){
        log.error(e.getMessage());
        return R.error(e.getMessage());
    }

    /**
     * 空指针异常处理
     * @param e 异常对象
     * @return 返回前端信息展示
     */
    @ExceptionHandler(NullPointerException.class)
    public R<String> nullPointerExceptionHandler(NullPointerException e){
        log.error("错误信息为： " + e.getMessage());
//        e.printStackTrace(System.out);
        return R.error("出现了空指针异常");
    }

    /**
     * 处理图片上传下载中的io异常
     * @param e 异常对象
     * @return 前端提示
     */
    @ExceptionHandler(IOException.class)
    public R<String> ioException(IOException e){
        log.error("io错误信息为: " +  e.getMessage());
        return R.error(e.getMessage());
    }

    /**
     * 处理图像上传和下载问题中的文件未找到异常
     * @param e 异常对象
     * @return 前端提示
     */
    @ExceptionHandler(FileNotFoundException.class)
    public R<String> fileNotFoundException(FileNotFoundException e){
        log.error("发生了文件未找到错误" + e.getMessage());
        return R.error("发生了文件未找到异常");
    }

}
